import pygame
import random
from pygame.locals import *


X=0
Y=1
PATCH_SIZE = (6,6)
COLOR_ARVORE = (0,255,0)
COLOR_FOGO = (255,0,0)
COLOR_CLAREIRA = (126,62,0)
COLOR_FOGO_EMINENTE = (255,255,0)
ESTADO_ARVORE = 0
ESTADO_CLAREIRA = 1
ESTADO_FOGO = 2
ESTADO_FOGO_EMINENTE = 3

class Patch:
    
    def __init__(self,SCREEN,x,y,g):
        self.SCREEN = SCREEN
        self.x = x
        self.y = y
        self.defForma()
        self.setState(ESTADO_CLAREIRA)
        #self.desenhar(COLOR_CLAREIRA)
        self.g = g

    
    def gerarArvore(self):
        if self.getState() == ESTADO_CLAREIRA:
            if random.random() <= self.g:
                self.setState(ESTADO_ARVORE)
                self.desenhar(COLOR_ARVORE)
    
    def gerarFogoNatural(self,f):
        if self.state == ESTADO_ARVORE:
            if random.random() <= f:
                self.setState(ESTADO_FOGO_EMINENTE)
                self.desenhar(COLOR_FOGO_EMINENTE)
    
    def gerarFogoPropagado(self,r):
        if self.getState() == ESTADO_ARVORE:
            if random.random() > r:
                self.setState(ESTADO_FOGO_EMINENTE)
                self.desenhar(COLOR_FOGO_EMINENTE)
    
    def propagarFogo(self,r):
        if self.getState() == ESTADO_FOGO:
            for n in self.getNeigh8():
                n.gerarFogoPropagado(r)
            self.setState(ESTADO_CLAREIRA)
            self.desenhar(COLOR_CLAREIRA)
    
    def gerarClareira(self):
        self.setState(ESTADO_CLAREIRA)
        self.desenhar(COLOR_CLAREIRA)
    
    def gerarFogo(self):
        if self.getState() == ESTADO_FOGO_EMINENTE:
            self.setState(ESTADO_FOGO)
            self.desenhar(COLOR_FOGO)
                
        
    def genCoordNeigh8(self,grid_size):
        xp1 = (self.x + 1) % grid_size[X]
        xm1 = (self.x - 1) % grid_size[X]
        yp1 = (self.y + 1) % grid_size[Y]
        ym1 = (self.y - 1) % grid_size[Y]
        list8 = [(xm1,ym1),(self.x,ym1),(xp1,ym1),
                 (xm1,self.y),(xp1,self.y),
                 (xm1,yp1),(self.x,yp1),(xp1,yp1)]
        return list8
    
    def setNeigh8(self,neighLst):
        self.neigh8 = neighLst
    
    def getNeigh8(self):
        return self.neigh8
    
    def setState(self,state):
        self.state = state
        if self.state == ESTADO_ARVORE:
            self.desenhar(COLOR_ARVORE)
        elif self.state == ESTADO_FOGO:
            self.desenhar(COLOR_FOGO)
        else:
            self.desenhar(COLOR_CLAREIRA)
        
    def getState(self):
        return self.state
    
    def defForma(self):
        #self.forma = Rect(self.x*PATCH_SIZE[X],self.y*PATCH_SIZE[Y],PATCH_SIZE[X],PATCH_SIZE[Y])
        #pygame.draw.rect(self.SCREEN,COLOR_OFF,self.forma,3)
        self.raio = PATCH_SIZE[X]/2
        self.coordenada = (self.x*PATCH_SIZE[X]+self.raio,self.y*PATCH_SIZE[Y]+self.raio)
        
    
    def desenhar(self,color):
        #pygame.draw.rect(self.SCREEN,color,self.forma,3)
       
        pygame.draw.circle(self.SCREEN,color,self.coordenada,self.raio,3)
    